package slidingwindow;

import java.util.HashMap;
import java.util.Map;

/**
 * 滑动窗口算法模板
 * 伪代码
 */
public class SlidingWindowTemplate {

    // 用比较合适的数据结构记录窗口中的数据，根据场景进行变通
    // 比如，想记录窗口中元素出现的次数，就用map
    // 如果只想记录窗口中的元素和，则只需int
    public void slidingWindow(String s) {
        Map<Integer, Character> window = new HashMap<>();

        int left = 0, right = 0;
        while (right < s.length()) {
            // c 是移入窗口的字符
            char c = s.charAt(right);
            window.put(right, c);
            // 增大窗口
            right++;
            // 进行窗口内的一系列数据更新
            // ...

            // ******** debug输出的位置 ********
            // 注意在最终的解法代码中不要print
            // 因为IO操作很费时间，可能导致超时
            System.out.printf("window: [%d, %d)\n", left, right);
            // ****************************

            // 判断左侧窗口是否需要收缩
            while (left < right) {
                // d 是将移出窗口的字符
                char d = s.charAt(left);
                window.remove(left);
                // 缩小窗口
                left++;
                // 进行窗口内数据的一系列更新
                // ...
            }

        }
    }
}
